home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / dev / misc / egs.lha / EGS / EGS_Devels / Examples / EGS_Gadget / calc.c < prev    next >
C/C++ Source or Header  |  1993-02-16  |  12KB  |  369 lines

  1. /**************************************************************************
  2. *****                      Calculator Demo                            *****
  3. *****                                                                 *****
  4. *****                     by John J. Karcher                          *****
  5. *****                                                                 *****
  6. *****                       10 August 1992                            *****
  7. *****                       10 Jan 1993 mvk                           *****
  8. *****                                                                 *****
  9. **************************************************************************/
  10.  
  11. /*
  12.    Note: This is not a very good calulator, but you get the point.
  13. */
  14.  
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <exec/types.h>
  18. #include <egs/egsintui.h>
  19. #include <egs/egsgadbox.h>
  20. #include <proto/exec.h>
  21. #include <egs/proto/all.h>
  22. //#include <egs/pragmas/all.h>
  23.  
  24. /*
  25. **  Protos
  26. */
  27.  
  28.  
  29. BYTE  CreateGfx(void);
  30. BYTE  CreateWindow(void);
  31. void  UpdateDisplay(void);
  32.  
  33.  
  34. #define  ID_0        0x10
  35. #define  ID_1        0x11
  36. #define  ID_2        0x12
  37. #define  ID_3        0x13
  38. #define  ID_4        0x14
  39. #define  ID_5        0x15
  40. #define  ID_6        0x16
  41. #define  ID_7        0x17
  42. #define  ID_8        0x18
  43. #define  ID_9        0x19
  44. #define  ID_PLUS     0x21
  45. #define  ID_MINUS    0x22
  46. #define  ID_TIMES    0x23
  47. #define  ID_DIV      0x24
  48. #define  ID_POINT    0x31
  49. #define  ID_CLEAR    0x32
  50. #define  ID_EQUAL    0x33
  51.  
  52.  
  53. struct Library *EGSIntuiBase;
  54. struct Library *EGSGfxBase;
  55. struct Library *EGBBase;
  56.  
  57. struct EB_GadContextNode   *GadCon;
  58. struct EI_Window           *Win;
  59. struct EG_EFont            *Font;
  60.  
  61. struct EB_InfoBox    Display;
  62.  
  63. double   Arg1, Arg2, Res, Place;
  64. UBYTE    Valid, Oper;
  65.  
  66. BYTE  CreateGfx(void)
  67. {
  68.    struct EB_GadBox  *root, *a1, *a2, *b1, *b2, *b3, *b4, *b6;
  69.    BYTE  ret = 0;
  70.  
  71.    if (GadCon = EB_CreateGadContext(NULL, NULL, -1, -1))
  72.      {
  73.       root = EB_CreateVertiBox(GadCon);
  74.       EB_AddLastSon(root, EB_CreateVertiFill(GadCon, TRUE, 0));
  75.  
  76.       a1 = EB_CreateHorizBox(GadCon);
  77.       EB_AddLastSon(root, a1);
  78.       EB_AddLastSon(a1, EB_CreateHorizFill(GadCon, TRUE, 0));
  79.       EB_AddLastSon(a1, EB_CreateInfoBox(GadCon, &Display, Font, 6, 12, EI_JUSTIFY_RIGHT));
  80.       EB_AddLastSon(a1, EB_CreateHorizFill(GadCon, TRUE, 0));
  81.  
  82.       EB_AddLastSon(root, EB_CreateVertiFill(GadCon, TRUE, 0));
  83.  
  84.       a2 = EB_CreateVertiTable(GadCon);
  85.       EB_AddLastSon(root, a2);
  86.  
  87.       b6 = EB_CreateHorizBox(GadCon);
  88.       EB_AddLastSon(a2, b6);
  89.       EB_AddLastSon(b6, EB_CreateHorizFill(GadCon, TRUE, 0));
  90.       EB_AddLastSon(b6, EB_CreateTextAction(GadCon, " ", 0, EB_FILL_ALL));
  91.       EB_AddLastSon(b6, EB_CreateHorizFill(GadCon, TRUE, 0));
  92.       EB_AddLastSon(b6, EB_CreateTextAction(GadCon, " ", 0, EB_FILL_ALL));
  93.       EB_AddLastSon(b6, EB_CreateHorizFill(GadCon, TRUE, 0));
  94.       EB_AddLastSon(b6, EB_CreateTextAction(GadCon, " ", 0, EB_FILL_ALL));
  95.       EB_AddLastSon(b6, EB_CreateHorizFill(GadCon, TRUE, 0));
  96.       EB_AddLastSon(b6, EB_CreateTextAction(GadCon, "C", ID_CLEAR, EB_FILL_ALL));
  97.       EB_AddLastSon(b6, EB_CreateHorizFill(GadCon, TRUE, 0));
  98.  
  99.       EB_AddLastSon(a2, EB_CreateVertiFill(GadCon, TRUE, 0));
  100.  
  101.       b1 = EB_CreateHorizBox(GadCon);
  102.       EB_AddLastSon(a2, b1);
  103.       EB_AddLastSon(b1, EB_CreateHorizFill(GadCon, TRUE, 0));
  104.       EB_AddLastSon(b1, EB_CreateTextAction(GadCon, "7", ID_7, EB_FILL_ALL));
  105.       EB_AddLastSon(b1, EB_CreateHorizFill(GadCon, TRUE, 0));
  106.       EB_AddLastSon(b1, EB_CreateTextAction(GadCon, "8", ID_8, EB_FILL_ALL));
  107.       EB_AddLastSon(b1, EB_CreateHorizFill(GadCon, TRUE, 0));
  108.       EB_AddLastSon(b1, EB_CreateTextAction(GadCon, "9", ID_9, EB_FILL_ALL));
  109.       EB_AddLastSon(b1, EB_CreateHorizFill(GadCon, TRUE, 0));
  110.       EB_AddLastSon(b1, EB_CreateTextAction(GadCon, "/", ID_DIV, EB_FILL_ALL));
  111.       EB_AddLastSon(b1, EB_CreateHorizFill(GadCon, TRUE, 0));
  112.  
  113.       EB_AddLastSon(a2, EB_CreateVertiFill(GadCon, TRUE, 0));
  114.  
  115.       b2 = EB_CreateHorizBox(GadCon);
  116.       EB_AddLastSon(a2, b2);
  117.       EB_AddLastSon(b2, EB_CreateHorizFill(GadCon, TRUE, 0));
  118.       EB_AddLastSon(b2, EB_CreateTextAction(GadCon, "4", ID_4, EB_FILL_ALL));
  119.       EB_AddLastSon(b2, EB_CreateHorizFill(GadCon, TRUE, 0));
  120.       EB_AddLastSon(b2, EB_CreateTextAction(GadCon, "5", ID_5, EB_FILL_ALL));
  121.       EB_AddLastSon(b2, EB_CreateHorizFill(GadCon, TRUE, 0));
  122.       EB_AddLastSon(b2, EB_CreateTextAction(GadCon, "6", ID_6, EB_FILL_ALL));
  123.       EB_AddLastSon(b2, EB_CreateHorizFill(GadCon, TRUE, 0));
  124.       EB_AddLastSon(b2, EB_CreateTextAction(GadCon, "*", ID_TIMES, EB_FILL_ALL));
  125.       EB_AddLastSon(b2, EB_CreateHorizFill(GadCon, TRUE, 0));
  126.  
  127.       EB_AddLastSon(a2, EB_CreateVertiFill(GadCon, TRUE, 0));
  128.  
  129.       b3 = EB_CreateHorizBox(GadCon);
  130.       EB_AddLastSon(a2, b3);
  131.       EB_AddLastSon(b3, EB_CreateHorizFill(GadCon, TRUE, 0));
  132.       EB_AddLastSon(b3, EB_CreateTextAction(GadCon, "1", ID_1, EB_FILL_ALL));
  133.       EB_AddLastSon(b3, EB_CreateHorizFill(GadCon, TRUE, 0));
  134.       EB_AddLastSon(b3, EB_CreateTextAction(GadCon, "2", ID_2, EB_FILL_ALL));
  135.       EB_AddLastSon(b3, EB_CreateHorizFill(GadCon, TRUE, 0));
  136.       EB_AddLastSon(b3, EB_CreateTextAction(GadCon, "3", ID_3, EB_FILL_ALL));
  137.       EB_AddLastSon(b3, EB_CreateHorizFill(GadCon, TRUE, 0));
  138.       EB_AddLastSon(b3, EB_CreateTextAction(GadCon, "-", ID_MINUS, EB_FILL_ALL));
  139.       EB_AddLastSon(b3, EB_CreateHorizFill(GadCon, TRUE, 0));
  140.  
  141.       EB_AddLastSon(a2, EB_CreateVertiFill(GadCon, TRUE, 0));
  142.  
  143.       b4 = EB_CreateHorizBox(GadCon);
  144.       EB_AddLastSon(a2, b4);
  145.       EB_AddLastSon(b4, EB_CreateHorizFill(GadCon, TRUE, 0));
  146.       EB_AddLastSon(b4, EB_CreateTextAction(GadCon, "0", ID_0, EB_FILL_ALL));
  147.       EB_AddLastSon(b4, EB_CreateHorizFill(GadCon, TRUE, 0));
  148.       EB_AddLastSon(b4, EB_CreateTextAction(GadCon, ".", ID_POINT, EB_FILL_ALL));
  149.       EB_AddLastSon(b4, EB_CreateHorizFill(GadCon, TRUE, 0));
  150.       EB_AddLastSon(b4, EB_CreateTextAction(GadCon, "=", ID_EQUAL, EB_FILL_ALL));
  151.       EB_AddLastSon(b4, EB_CreateHorizFill(GadCon, TRUE, 0));
  152.       EB_AddLastSon(b4, EB_CreateTextAction(GadCon, "+", ID_PLUS, EB_FILL_ALL));
  153.       EB_AddLastSon(b4, EB_CreateHorizFill(GadCon, TRUE, 0));
  154.  
  155.       EB_AddLastSon(a2, EB_CreateVertiFill(GadCon, TRUE, 0));
  156.  
  157.       b1   = root;
  158.       root = EB_CreateMaster(GadCon, 0, 0);
  159.       EB_AddLastSon(root, b1);
  160.       b1   = root;
  161.       root = EB_CreateWindow(GadCon, 0, 0);
  162.       EB_AddLastSon(root, EB_CreateBorder(GadCon, b1, 0));
  163.  
  164.       if (Win)
  165.         {
  166.          root->MinWidth  = Win->Width;
  167.          root->MaxWidth  = Win->Width;
  168.          root->MinHeight = Win->Height;
  169.          root->MaxHeight = Win->Height;
  170.         }
  171.  
  172.       if (EB_ProcessGadBoxes(GadCon, root))
  173.         {
  174.          ret = 1;
  175.         }
  176.      }
  177.  
  178.    return ret;
  179. }
  180.  
  181. BYTE  CreateWindow(void)
  182. {
  183.    BYTE  ret = 0;
  184.  
  185.    if (CreateGfx())
  186.      {
  187.       GadCon->NewWin->Title              = "EGS Calculator Demo";
  188.       GadCon->NewWin->Flags             &= ~EI_SMART_REFRESH;
  189.       GadCon->NewWin->Flags             |= (EI_SIZEBBOTTOM | EI_SIMPLE_REFRESH);
  190.       GadCon->NewWin->IDCMPFlags        |= (EI_iCLOSEWINDOW | EI_iGADGETUP | EI_iSIZEVERIFY | EI_iNEWSIZE);
  191.       GadCon->NewWin->Bordef.SysGadgets |= (EI_WINDOWCLOSE | EI_WINDOWSIZE);
  192.       if (Win = EI_OpenWindow(GadCon->NewWin))
  193.         {
  194.          ret = 1;
  195.         }
  196.      }
  197.  
  198.    return ret;
  199. }
  200.  
  201. void  UpdateDisplay(void)
  202. {
  203.    char  buffer[64];
  204.  
  205.    sprintf(buffer, "%g", Res);
  206.  
  207.    EB_WriteInfoBox(&Display, Win, buffer);
  208. }
  209.  
  210. void  DoDigit(LONG digit)
  211. {
  212.    LONG  Digit;
  213.  
  214.    if (digit >= ID_0 && digit <= ID_9)
  215.      {
  216.       Digit = digit & 0x0f;
  217.  
  218.       if (!Valid)
  219.         {
  220.          Valid = 1;
  221.          Place = 0;
  222.          Res   = 0;
  223.         }
  224.  
  225.       if (Res > -100000000 && Res < 100000000)
  226.         {
  227.          if (Place)
  228.            {
  229.             Place *= 10;
  230.             Res   += (Digit / Place);
  231.            }
  232.          else
  233.            {
  234.             Res = Res * 10 + Digit;
  235.            }
  236.          if (Oper) Arg2 = Res;
  237.             else Arg1 = Res;
  238.         }
  239.  
  240.       UpdateDisplay();
  241.      }
  242. }
  243.  
  244. void  DoArithmetic(LONG arith)
  245. {
  246.    if (arith >= ID_PLUS && arith <= ID_DIV)
  247.      {
  248.       Oper  = arith;
  249.       Arg2 = Res;
  250.       Valid = 0;
  251.       UpdateDisplay();
  252.      }
  253. }
  254.  
  255. void  DoSpecial(LONG special)
  256. {
  257.    if (special >= ID_POINT && special <= ID_EQUAL)
  258.      {
  259.       if (special == ID_POINT)
  260.         {
  261.          if (!Valid)
  262.            {
  263.             Valid = 1;
  264.             Place = 0;
  265.             Res   = 0;
  266.            }
  267.          if (!Place) Place = 1;
  268.         }
  269.  
  270.       if (special == ID_CLEAR)
  271.         {
  272.          Res   = 0;
  273.          Arg1  = 0;
  274.          Arg2  = 0;
  275.          Valid = 0;
  276.          Place = 0;
  277.         }
  278.  
  279.       if (special == ID_EQUAL)
  280.         {
  281.          if (Oper == ID_PLUS)  Res = Arg1 + Arg2;
  282.          if (Oper == ID_MINUS) Res = Arg1 - Arg2;
  283.          if (Oper == ID_TIMES) Res = Arg1 * Arg2;
  284.          if (Oper == ID_DIV)   Res = Arg1 / Arg2;
  285.          Arg1 = Res;
  286.          Oper = 0;
  287.          Valid = 0;
  288.         }
  289.       UpdateDisplay();
  290.      }
  291. }
  292.  
  293. main()
  294. {
  295.    struct EI_EIntuiMsg  *IMsg;
  296.    struct EI_Gadget     *TempGad;
  297.    BYTE  quit = 0;
  298.  
  299.    if (EGSIntuiBase = OpenLibrary("egsintui.library", 0))
  300.      {
  301.       if (EGSGfxBase = OpenLibrary("egsgfx.library", 0))
  302.         {
  303.          if (EGBBase = OpenLibrary("egsgadbox.library", 0))
  304.            {
  305.             if (Font = EG_OpenFont(EI_GetPrefFont(1)))
  306.               {
  307.                if (CreateWindow())
  308.                  {
  309.                   UpdateDisplay();
  310.                   while (!quit)
  311.                     {
  312.                      WaitPort(Win->UserPort);
  313.                      if (IMsg = (struct EI_EIntuiMsg *)GetMsg(Win->UserPort))
  314.                        {
  315.                         if (IMsg->Class == EI_iCLOSEWINDOW)
  316.                           {
  317.                            quit = 1;
  318.                           }
  319.                         if (IMsg->Class == EI_iGADGETUP)
  320.                           {
  321.                            if (TempGad = (struct EI_Gadget *)IMsg->IAddress)
  322.                              {
  323.                               if ((TempGad->GadgetID & 0xf0) == 0x10)
  324.                                 {
  325.                                  DoDigit(TempGad->GadgetID);
  326.                                 }
  327.                               if ((TempGad->GadgetID & 0xf0) == 0x20)
  328.                                 {
  329.                                  DoArithmetic(TempGad->GadgetID);
  330.                                 }
  331.                               if ((TempGad->GadgetID & 0xf0) == 0x30)
  332.                                 {
  333.                                  DoSpecial(TempGad->GadgetID);
  334.                                 }
  335.                              }
  336.                           }
  337.                         if (IMsg->Class == EI_iSIZEVERIFY)
  338.                           {
  339.                            EI_RemoveGList(Win, GadCon->First, GadCon->Num);
  340.                            EB_DeleteGadContext(GadCon);
  341.                            GadCon = NULL;
  342.                           }
  343.                         if (IMsg->Class == EI_iNEWSIZE)
  344.                           {
  345.                            EI_LockIntuition();
  346.                            CreateGfx();
  347.                            if (GadCon)
  348.                              {
  349.                               EI_AddGList(Win, GadCon->First, GadCon->Num);
  350.                              }
  351.                            EI_UnlockIntuition();
  352.                            UpdateDisplay();
  353.                           }
  354.                         ReplyMsg((struct Message *)IMsg);
  355.                        }
  356.                     }
  357.                  }
  358.                EG_CloseFont(Font);
  359.               }
  360.             if (Win) EI_CloseWindow(Win);
  361.             if (GadCon) EB_DeleteGadContext(GadCon);
  362.             CloseLibrary(EGBBase);
  363.            }
  364.          CloseLibrary(EGSGfxBase);
  365.         }
  366.       CloseLibrary(EGSIntuiBase);
  367.      }
  368. }
  369.